package com.tddx.activiti.utils.ftl;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;

import org.apache.log4j.Logger;

import com.tddx.activiti.utils.FileUtils;
import com.tddx.activiti.utils.ftl.data.BaseData;

import freemarker.template.Configuration;
import freemarker.template.Template;

/**
 * 模版生成文件的方法
 * @author zhaoyanwei
 * 执行方式new FtlMarker().initTemplate(data).writeFile();//data 为Map<String, Object>类型
 */
public class FtlMarker {

	/**
	 * 模版文件存放位置
	 */
	private String fromFile;
	
	/**
	 * 目标路径
	 */
	private String toFile;
	
	/**
	 * 模版文件存放位置 + 文件名
	 */
	private String ftlName;
	
	/**
	 * Ftl Configuration 配置信息
	 */
	private Configuration cfg;
	
	/**
	 * 模版
	 */
	private Template template;
	
	/**
	 * 替换模版的  数据
	 */
	private BaseData data;
	
	private Logger log = Logger.getLogger(this.getClass());

	/**
	 * 初始化FtlMarker
	 * @param ftlName
	 * @param toFile
	 */
	public FtlMarker(String fromFile, String toFile, String ftlName) {
		super();
		this.fromFile = fromFile;
		this.ftlName = ftlName;
		this.toFile = toFile;
	}
	
	/**
	 * 写入文件
	 * @throws Exception
	 */
	public void writeFile() throws Exception{
		File f = FileUtils.createFile(toFile);
		FileOutputStream fos = new FileOutputStream(f);
		Writer wr = new BufferedWriter(new OutputStreamWriter(fos));
		template.process(data, wr);
		wr.flush();
		log.info("执行成功，已生成文件：" + toFile);
		wr.close();
		fos.close();
	}
	
	/**
	 * 准备数据
	 * @param data
	 * @return
	 * @throws Exception
	 */
	public FtlMarker initTemplate(BaseData data) throws Exception{
		setConfig();
		setTemplate();
		this.data=data;
		return this;
	}
	
	public void setConfig(){
		if(cfg==null){
			this.cfg = new Configuration();
			this.cfg.setDefaultEncoding("UTF-8");
		}
	}
	
	public void setTemplate() throws Exception{
		cfg.setClassForTemplateLoading(this.getClass(), fromFile);
		this.template = cfg.getTemplate(ftlName);
		this.cfg.setDefaultEncoding("UTF-8");
	}
	
}
